{***************************************************************
    SpyGestion  Copyright (C) 2008 Christophe KOALI <nature2gas@gmail.com>
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
****************************************************************}
unit modPlayerFinal;

interface

uses modGIDtoSTR,            // GID to STR
     Classes,
     modBaseType,
     modPlanete,

     modClasses,
     L01_modPlayerUtils,
     L05_modFlotteTracking,
     L10_modClassesAlerteAtt,
     L20_modClassesConstruction,
     L30_modClassesWithDB,
     L35_modEvacuationAuto,
     L40_modPowerClasses,
     L50_modSondagesPlayer;


type
    TPlayerFinal = class(TPowerSondagePlayer)
    public
        procedure OnTimer; override;

        procedure ShowInternal; override;

        
        procedure ExportEmpireToText(lt: TStrings; GidToStr: TCollectionGIDtoSTR);

    end;

implementation

uses ESBDates, SysUtils, gnugettext;

procedure TPlayerFinal.ShowInternal;
begin
        inherited ShowInternal;

        DoDebug('@@@@@@@@@@@@@@');

end;

procedure TPlayerFinal.OnTimer;
begin
    // lock pour les vérification MAIS PAS pour l'exécution de l'intérieur
    // du timer, ce verou permet de s'assurer que le vérou par
    // variables de classe s'est bien mis en place
    Lock;

    // ATTENTION: Il faut rentrer dans le timer si iMustRelogin est à true
    // car c'est lui qui indique qu'il faut faire l'auto relogin
    if FInTimer then begin
       Unlock;
       exit;
    end;


    // Vérifie si les conditions sont ok pour pouvoir entrer dans le timer
    if NoT(CanEnterInTimer) then begin
       Unlock;
       exit;
    end;

    // Entre dans le timer
    EnterTimer;

    // déverouille avant d'entrer dans le timer puisque le vérou par variable
    // de classe a été mis en plus
    Unlock;

    LastCurrDate := DateTimeToUnix(Now);

    //try
      inherited OnTimer;
    //except
    //  DoDebug('Final.OnTimer - Fatal Exception');
    //  FJobOccupation := jobpAucun;
    //end;

    ExitTimer;
end;



procedure TPlayerFinal.ExportEmpireToText(lt: TStrings; GidToStr: TCollectionGIDtoSTR);
label AjustEspace;
const ColLength = 8;
var MaxLengthStr: integer;
    TotalLength: integer;

    gi, i: integer;
    cPlanete : TPlaneteInfo;
    peElement: POGItemCost;
    peGID    : PGIDtoSTR;

    bIgnore  : boolean;
    CurrLigne, sAdd, BlankGlobalLine, BlankSuiteLine: string;

    EspaceBlanc: integer;
    CurrGIDType, LastGIDType: integer;
    coord: TPlanetLocation;
begin

    MaxLengthStr := GidToStr.GetMaxLengthStr;

    if MaxLengthStr < 5 then
       // pas d'élément
       exit;

    if GidToStr.Count < 5 then
       // pas d'élément
       exit;



    // ColLength + 1 car on prend en compte le séparateur de colonne
    // +1 pour le tout premier séparateur des planètes
    // +1 à la fin pour le tout premier séparateur de gauche
    TotalLength := (allPlanetes.Count * (ColLength + 1)) + 1 + MaxLengthStr + 1;

    BlankGlobalLine := '+' + StringOfChar('-', TotalLength - 2) + '+';

    // s'assure que les gid sont dans l'ordre
    GidToStr.Trie;

    LastGIDType := -1;



    BlankSuiteLine :=  '+' + StringOfChar('-', MaxLengthStr) + '+';

    for i := 0 to allPlanetes.Count - 1 do begin
        BlankSuiteLine := BlankSuiteLine + StringOfChar('-', ColLength) + '+';
    end;



    // début, première ligne
    lt.Add('[code]' + BlankGlobalLine);



    sAdd := _('Coordonnées');
    CurrLigne := '|' + sAdd + StringOfChar(' ', MaxLengthStr - length(sAdd)) + '|';


       for i := 0 to allPlanetes.Count - 1 do begin
           cPlanete := allPlanetes.Items[i];

           coord := cPlanete.FLocation;
           coord.Position := mbtGetRealPosition(coord.Position);
           sAdd := mbtPlanetLocationToStr(coord);

              EspaceBlanc := ColLength - length(sAdd);

              if EspaceBlanc <= 0 then begin
                 // on change rien

              end else if (EspaceBlanc mod 2) = 0 then begin
                 // nombre pair
                 EspaceBlanc := EspaceBlanc div 2;
                 sAdd := StringOfChar(' ', EspaceBlanc) + sAdd + StringOfChar(' ', EspaceBlanc);

              end else begin
                 // nombre impair
                 // on met le plus d'espace à gauche
                 Dec(EspaceBlanc);
                 EspaceBlanc := EspaceBlanc div 2;

                 if length(sAdd) > 2 then begin
                    // met plus d'espace à gauche
                    sAdd := StringOfChar(' ', EspaceBlanc + 1) + sAdd + StringOfChar(' ', EspaceBlanc);
                 end else begin
                    // met plus d'espace à droite
                    sAdd := StringOfChar(' ', EspaceBlanc) + sAdd + StringOfChar(' ', EspaceBlanc + 1);
                 end;

              end;

              CurrLigne := CurrLigne + sAdd + '|';
       end;

    lt.Add(CurrLigne);
    lt.Add(BlankSuiteLine);


    sAdd := _('Cases');
    CurrLigne := '|' + sAdd + StringOfChar(' ', MaxLengthStr - length(sAdd)) + '|';


       for i := 0 to allPlanetes.Count - 1 do begin
           cPlanete := allPlanetes.Items[i];


           sAdd := format('%d/%d', [cPlanete.FNbCasesOccupees, cPlanete.FNbCasesTotales]);

              EspaceBlanc := ColLength - length(sAdd);

              if EspaceBlanc <= 0 then begin
                 // on change rien

              end else if (EspaceBlanc mod 2) = 0 then begin
                 // nombre pair
                 EspaceBlanc := EspaceBlanc div 2;
                 sAdd := StringOfChar(' ', EspaceBlanc) + sAdd + StringOfChar(' ', EspaceBlanc);

              end else begin
                 // nombre impair
                 // on met le plus d'espace à gauche
                 Dec(EspaceBlanc);
                 EspaceBlanc := EspaceBlanc div 2;

                 if length(sAdd) > 2 then begin
                    // met plus d'espace à gauche
                    sAdd := StringOfChar(' ', EspaceBlanc + 1) + sAdd + StringOfChar(' ', EspaceBlanc);
                 end else begin
                    // met plus d'espace à droite
                    sAdd := StringOfChar(' ', EspaceBlanc) + sAdd + StringOfChar(' ', EspaceBlanc + 1);
                 end;

              end;

              CurrLigne := CurrLigne + sAdd + '|';
       end;

    lt.Add(CurrLigne);
    //lt.Add(BlankGlobalLine);
    


    for gi := 0 to GidToStr.Count - 1 do begin
       peGID := GidToStr.Items[gi];

       CurrGIDType := GetTypeOfGID(peGID.GID);

       if LastGIDType <> CurrGIDType then begin

          sAdd := '';
          case CurrGIDType of
              CNT_ITEM_DESIGN_BATIMENT: begin
                          sAdd := 'Bâtiments';
                       end;
              CNT_ITEM_DESIGN_RECHERCHE: begin
                          Continue;
                       end;
              CNT_ITEM_DESIGN_VAISSEAUX: begin
                          sAdd := 'Vaisseaux';
                       end;
              CNT_ITEM_DESIGN_DEFENSE: begin
                          sAdd := 'Défenses';
                       end;
              CNT_ITEM_DESIGN_DEFAUT: begin
                          Continue;
                       end;
              else Continue;

          end;

          lt.Add(BlankGlobalLine);


          EspaceBlanc := TotalLength - 2 - length(sAdd);

          if (EspaceBlanc mod 2) = 0 then begin
              // nombre pair
              EspaceBlanc := EspaceBlanc div 2;
              sAdd := StringOfChar(' ', EspaceBlanc) + sAdd + StringOfChar(' ', EspaceBlanc);

          end else begin
              // nombre impair
              // met plus d'espace à droite
              Dec(EspaceBlanc);
              EspaceBlanc := EspaceBlanc div 2;
              sAdd := StringOfChar(' ', EspaceBlanc) + sAdd + StringOfChar(' ', EspaceBlanc + 1);
          end;

          sAdd := '|' + sAdd + '|';
          lt.Add(sAdd);

          StringOfChar(' ', EspaceBlanc);


          lt.Add(BlankGlobalLine);
          LastGIDType := CurrGIDType;

       end else begin
          // c'est la suite du même type de GID
          lt.Add(BlankSuiteLine);
       end;

       
       CurrLigne := '';
       CurrLigne := '|' + peGID.Valeur + StringOfChar(' ', MaxLengthStr - length(peGID.Valeur)) + '|';

       bIgnore   := true;

       for i := 0 to allPlanetes.Count - 1 do begin
           cPlanete := allPlanetes.Items[i];

           peElement := cPlanete.cElements.GetGidItem(peGID.GID);

           if peElement <> nil then begin
              bIgnore := false;

              sAdd := IntToStr(peElement.Niveau);


AjustEspace:
              EspaceBlanc := ColLength - length(sAdd);

              if EspaceBlanc <= 0 then begin
                 // on change rien

              end else if (EspaceBlanc mod 2) = 0 then begin
                 // nombre pair
                 EspaceBlanc := EspaceBlanc div 2;
                 sAdd := StringOfChar(' ', EspaceBlanc) + sAdd + StringOfChar(' ', EspaceBlanc);

              end else begin
                 // nombre impair
                 // on met le plus d'espace à gauche
                 Dec(EspaceBlanc);
                 EspaceBlanc := EspaceBlanc div 2;

                 if length(sAdd) > 2 then begin
                    // met plus d'espace à droite
                    sAdd := StringOfChar(' ', EspaceBlanc) + sAdd + StringOfChar(' ', EspaceBlanc + 1);
                 end else begin
                    // met plus d'espace à gauche
                    sAdd := StringOfChar(' ', EspaceBlanc + 1) + sAdd + StringOfChar(' ', EspaceBlanc);
                 end;

              end;

              CurrLigne := CurrLigne + sAdd + '|';

           end else begin
              // l'élément n'existe pas
              sAdd := '-';
              goto AjustEspace;
           end;

       end;

       // affiche ce GID uniquement si au moins une planète possède ce type
       // d'élément
       if NoT(bIgnore) then begin
          lt.Add(CurrLigne);

       end;


    end;


    lt.Add(BlankGlobalLine + '[/code]');


    // affiche les recherches maintenant

end;

end.
